unit interfejs;


interface

uses Narzedzia, CRT, ListaUczniow, ListaPrzedmiotow, ListaOcen, ListaUwag;

procedure wyswietl_uczniow(head : wuczen);
procedure okno_usun_oceny(var head: wuczen);
procedure okno_dodaj_ocene(var head : wuczen);
procedure okno_usun_przedmiot(var head : wuczen);
procedure okno_dodaj_przedmiot(var head : wuczen);
procedure okno_usun_ucznia(var head : wuczen);
procedure okno_dodaj_uwage(var head: wuczen);
procedure okno_uwag(head: wuczen);
procedure okno_uczniow_i_ocen(head :wuczen);
procedure wyswietl_menu;
procedure wyswietl_glowne_okno;
procedure wyswietl_separator;
procedure stworz_okna;
procedure okno_dodaj_ucznia(var head: wuczen);

implementation

{---------------------------------}
{  Interfejs                      }
{---------------------------------}

{ procedura listuje tylko dane personalne uczniow }
procedure wyswietl_uczniow(head : wuczen);
begin
       while (head <> nil) do begin
           writeln('+ Uczen: ', head^.info.imie , ' ', head^.info.nazwisko);
           head := head^.nastepny_uczen;
       end;
end;

{ okno sluzace do skasowania CALEJ listy ocen }
procedure okno_usun_oceny(var head: wuczen);
  var
     przedmiot, imie, nazw : string;
     tmp_info : personal;
     tmp_uczen: wuczen;
     tmp_przedmiot : wprzedmioty;
     tmp_przedmiot1 : wprzedmioty;
  begin
     ClrScr;
     wyswietl_uczniow(head);

     writeln('Komu skasowac ocene ?');

     write('Podaj imie: ');
     readln(imie);

     write('Podaj nazwisko: ');
     readln(nazw);

      if not pusty_string(imie) and not pusty_string(nazw) then begin
          tmp_info.imie := imie;
          tmp_info.nazwisko := nazw;

          { szukamy ucznia ... }
          tmp_uczen := szukaj_ucznia(head, tmp_info);
          if(tmp_uczen <> nil) then begin

             { ...i istnieje, pokazemy liste przedmiotow jakie ma(o ile ma}
             if(tmp_uczen^.przedmioty <> nil) then begin
                tmp_przedmiot :=  tmp_uczen^.przedmioty;
                  while(tmp_przedmiot <> nil) do begin
                    writeln(tmp_przedmiot^.nazwa);
                    tmp_przedmiot := tmp_przedmiot^.nastepny_przedmiot;
                  end;

                  { wczytuemy przedmiot }
                  Write('Podaj nazwe przedmiotu z ktorych chcesz skasowac oceny: ');
                  readln(przedmiot);

                  { sprawdzmy czy uzy. nie wprowadzil pustej nazwy }
                  if not pusty_string(przedmiot) then begin

                        { teraz szukamy czy przedmiot o podanej nazwie istnieje }
                         tmp_przedmiot1 := szukaj_przedmiot(tmp_uczen^.przedmioty, przedmiot);

                        { sprawdzamy czy rzeczywiscie jest w lisice }
                         if(tmp_przedmiot1 <> nil) then begin

                             { mozemy usunac oceny przedmiotu }
                             usun_oceny(tmp_przedmiot1^.oceny);
                             writeln('Oceny skasowane !');
                        end
                        else begin
                           writeln('Taki przedmiot nie istnieje');
                        end;
                  end
                  else begin
                    writeln('Pusta tresc przedmiotu ?');
                  end;
             end
             else begin
                  writeln('Lista przedmiotow nie istnieje');
             end;
          end
          else begin
              writeln('Taki uczen nie istnieje.');
          end;
          end
          else begin
           writeln('Nie wypelniono wszystich pol.')
      end;
  end;

{ okno w ktorym dodajemy ocene }
procedure okno_dodaj_ocene(var head : wuczen);
var
   przedmiot, imie, nazw : string;
   tmp_info : personal;
   tmp_uczen: wuczen;
   tmp_przedmiot : wprzedmioty;
   tmp_przedmiot1 :wprzedmioty;
   nota : integer;
begin
   ClrScr;
   wyswietl_uczniow(head);

   writeln('Komu wstawic ocene ?');

   write('Podaj imie: ');
   readln(imie);

   write('Podaj nazwisko: ');
   readln(nazw);

    if not pusty_string(imie) and not pusty_string(nazw) then begin
        tmp_info.imie := imie;
        tmp_info.nazwisko := nazw;

        { szukamy ucznia ... }
        tmp_uczen := szukaj_ucznia(head, tmp_info);
        if(tmp_uczen <> nil) then begin

           { ...i istnieje, pokazemy liste przedmiotow jakie ma(o ile ma}
           if(tmp_uczen^.przedmioty <> nil) then begin
                tmp_przedmiot :=  tmp_uczen^.przedmioty;

                while(tmp_przedmiot <> nil) do begin
                  writeln(tmp_przedmiot^.nazwa);
                  tmp_przedmiot := tmp_przedmiot^.nastepny_przedmiot;
                end;

                { wczytujemy nazwe przedmiotu }
                Write('Podaj nazwe przedmiotu do wpisania oceny: ');
                readln(przedmiot);

                { sprawdzmy czy uzy. nie wprowadzil pustej nazwy }
                if not pusty_string(przedmiot) then begin

                { teraz szukamy czy przedmiot o podanej nazwie istnieje }
                  tmp_przedmiot1 := szukaj_przedmiot(tmp_uczen^.przedmioty, przedmiot);

                      { sprawdzamy czy rzeczywiscie jest w lisice }
                       if(tmp_przedmiot1 <> nil) then begin

                           { mozemy dodac ocene }
                            write('Podaj ocene: ');
                            readln(nota);
                            dodaj_ocene(tmp_przedmiot1^.oceny, nota);
                            writeln('Ocena dodana !');
                      end
                      else begin
                         writeln('Taki przedmiot nie istnieje');
                      end;
                end
                else begin
                     writeln('Pusta tresc przedmiotu ?');
                end;
           end
           else begin
                 writeln('Lista przedmiotow nie istnieje');
           end;
        end
        else begin
          writeln('Taki uczen nie istnieje.');
        end;
        end
    else begin
          writeln('Nie wypelniono wszystich pol.')
     end;

end;

{ okno w ktorym usuwamy dany przedmiot }
procedure okno_usun_przedmiot(var head : wuczen);
var
   przedmiot, imie, nazw : string;
   tmp_info : personal;
   tmp_uczen: wuczen;
   tmp_przedmiot, tmp_przedmiot1 : wprzedmioty;
begin
   ClrScr;
   wyswietl_uczniow(head);

   writeln('Komu usunac przedmiot ?');

   write('Podaj imie: ');
   readln(imie);

   write('Podaj nazwisko: ');
   readln(nazw);

    if not pusty_string(imie) and not pusty_string(nazw) then begin
        tmp_info.imie := imie;
        tmp_info.nazwisko := nazw;

        { szukamy ucznia ... }
        tmp_uczen := szukaj_ucznia(head, tmp_info);
        if(tmp_uczen <> nil) then begin

           { ...i istnieje, pokazemy liste przedmiotow jakie ma(o ile ma}
           if(tmp_uczen^.przedmioty <> nil) then begin
                 tmp_przedmiot :=  tmp_uczen^.przedmioty;
                while(tmp_przedmiot <> nil) do begin
                  writeln(tmp_przedmiot^.nazwa);
                  tmp_przedmiot := tmp_przedmiot^.nastepny_przedmiot;
                end;

                { wczytuemy przedmiot }
                Write('Podaj nazwe przedmiotu do usuniecia: ');
                readln(przedmiot);

                { sprawdzmy czy uzy. nie wprowadzil pustej nazwy }
                if not pusty_string(przedmiot) then begin

                      { teraz szukamy czy przedmiot o podanej nazwie istnieje }
                       tmp_przedmiot1 := szukaj_przedmiot(tmp_uczen^.przedmioty, przedmiot);

                      { sprawdzamy czy rzeczywiscie jest w lisice }
                       if(tmp_przedmiot1 <> nil) then begin

                           { mozemy go usunac }
                           usun_przedmiot(tmp_uczen^.przedmioty, tmp_przedmiot1);
                           writeln('Przedmiot usunieto.');
                      end
                      else begin
                         writeln('Taki przedmiot nie istnieje');
                      end;

                end
                else begin
                  writeln('Pusta tresc przedmiotu ?');
                end;
           end
           else begin
                writeln('Lista przedmiotow nie istnieje');
           end;
        end
        else begin
            writeln('Taki uczen nie istnieje.');
        end;
        end
        else begin
         writeln('Nie wypelniono wszystich pol.')
    end;
end;

{ okno w ktorum dodajemy przedmiot danemu uczniowi }
procedure okno_dodaj_przedmiot(var head : wuczen);
var
   przedmiot, imie, nazw : string;
   tmp_info : personal;
   tmp_uczen: wuczen;
   tmp_przedmiot : wprzedmioty;
begin
   ClrScr;
   wyswietl_uczniow(head);

   writeln('Komu dodac przedmiot ?');

   write('Podaj imie: ');
   readln(imie);

   write('Podaj nazwisko: ');
   readln(nazw);

    if not pusty_string(imie) and not pusty_string(nazw) then begin
        tmp_info.imie := imie;
        tmp_info.nazwisko := nazw;

        { szukamy ucznia ... }
        tmp_uczen := szukaj_ucznia(head, tmp_info);
        if(tmp_uczen <> nil) then begin

           { ... jest takowy, szukamy przedmiotu ... }
              Write('Podaj nazwe przedmiotu ktory chcesz dodac: ');
              readln(przedmiot);

              { ... ktory uzytkownik dobrze wprowadzil ...}
              if not pusty_string(przedmiot) then begin

                 { ... zatem szukamy go na liscie co by nie bylo duplikatow ... }
                     tmp_przedmiot := szukaj_przedmiot(tmp_uczen^.przedmioty, przedmiot);
                     if(tmp_przedmiot = nil) then begin

                        { ... wszystko ok - dodajemy nowy przedmiot. }
                        dodaj_przedmiot(tmp_uczen^.przedmioty, przedmiot);
                        Writeln('Dodano przedmiot: ', przedmiot);
                     end
                     else begin
                         writeln('Taki przedmiot juz istnieje!');
                     end;
              end
              else begin
                writeln('Tresc przedmiotu jest pusta ?');
              end;
        end
        else begin
            writeln('Taki uczen nie istnieje.');
        end;
        end
        else begin
         writeln('Nie wypelniono wszystich pol.')
    end;

end;

{ okno w ktorym usuwamy ucznia }
procedure okno_usun_ucznia(var head : wuczen);
var
   imie, nazw : string;
   tmp_info : personal;
   tmp_uczen: wuczen;
begin
   ClrScr;
   wyswietl_uczniow(head);

   writeln('Kogo usunac ?');

   write('Podaj imie: ');
   readln(imie);

   write('Podaj nazwisko: ');
   readln(nazw);

    if not pusty_string(imie) and not pusty_string(nazw) then begin
        tmp_info.imie := imie;
        tmp_info.nazwisko := nazw;

        tmp_uczen := szukaj_ucznia(head, tmp_info);
        if(tmp_uczen <> nil) then begin
           usun_ucznia(head, tmp_uczen);
           writeln('Uczen odwolany.');
        end
        else begin
             writeln('Taki uczen nie istnieje.');
        end;
    end
    else begin
         writeln('Nie wypelniono wszystich pol.')
    end;
end;

{ okno w ktorym dodajemy uwage }
procedure okno_dodaj_uwage(var head: wuczen);
var
   imie, nazw, uwaga : string;
   tmp_info : personal;
   tmp_uczen: wuczen;
begin
   ClrScr;
   wyswietl_uczniow(head);

   writeln('Komus dodac uwage ?');

   write('Podaj imie: ');
   readln(imie);

   write('Podaj nazwisko: ');
   readln(nazw);

    if not pusty_string(imie) and not pusty_string(nazw) then begin
        tmp_info.imie := imie;
        tmp_info.nazwisko := nazw;

        tmp_uczen := szukaj_ucznia(head, tmp_info);
        if(tmp_uczen <> nil) then begin
            ClrScr;
            WriteLn('Podaj uwage dla: ', tmp_uczen^.info.nazwisko);
            ReadLn(uwaga);

            if not pusty_string(uwaga) then begin
               dodaj_uwage(tmp_uczen^.uwagi, uwaga);
               writeln('Uwaga dodana !');
            end
            else begin
               writeln('Uwaga bez tresc?');
            end;
        end
        else begin
            writeln('Taki uczen nie istnieje.');
        end;
    end
    else begin
       writeln('Nie wypelniono wszystich pol.')
    end;
end;

{ okno w ktorym listujemy uwagi uzyskane przez ucznia }
procedure okno_uwag(head: wuczen);
var
   imie, nazw : string;
   tmp_info : personal;
   tmp_uczen: wuczen;
   tmp_uwaga: wuwagi;
begin
   ClrScr;
   wyswietl_uczniow(head);

   writeln('Podaj inf. zeby zobaczyc uwagi.');

   write('Podaj imie: ');
   readln(imie);

   write('Podaj nazwisko: ');
   readln(nazw);

    if not pusty_string(imie) and not pusty_string(nazw) then begin
        tmp_info.imie := imie;
        tmp_info.nazwisko := nazw;

        tmp_uczen := szukaj_ucznia(head, tmp_info);

        { sprawdzamy czy taki uczen istnieje ... }
        if tmp_uczen <> nil then begin

           { ...i czy uwagi tez jakies ma ... }
           tmp_uwaga := tmp_uczen^.uwagi;
           if(tmp_uwaga <> nil ) then begin

              { ... zatem wydrukujemy je. }
              ClrScr;
              writeln('Uwagi pana(i): ', tmp_uczen^.info.nazwisko);
              while( tmp_uwaga <> nil) do begin
                  writeln(tmp_uwaga^.tekst) ;
                  tmp_uwaga := tmp_uwaga^.nastepna_uwaga;
              end;
           end
           else begin
               writeln('Uwagi ucznia: Brak.');
           end;
        end
        else begin
           writeln('Taki uczen nie istnieje.');
        end;
      end
      else begin
       writeln('Nie wypelniono wszystich pol.')
     end;

end;

{ okno w ktorym listujemy uczniow ich przedmioty oraz oceny }
procedure okno_uczniow_i_ocen(head :wuczen);
var
   tmp_oceny : woceny;
   tmp_przedmioty :wprzedmioty;
begin
  ClrScr;
   while (head <> nil) do begin

     { listujemy uczniów }
     writeln('+ Uczen: ', head^.info.imie , ' ', head^.info.nazwisko);

     { listujemy przedmioty }
     if(head^.przedmioty = nil) then begin
        writeln('| Brak przedmiotow');
        end
        else begin
        writeln('| Przedmioty: ');
        tmp_przedmioty     := head^.przedmioty;
        while( tmp_przedmioty  <> nil) do begin
                write('|-> ', tmp_przedmioty^.nazwa, ': ');

                tmp_oceny := tmp_przedmioty^.oceny;

                { listujemy oceny danego przedmiotu }
                while(tmp_oceny <> nil) do begin
                        write(tmp_oceny^.nota, ',');
                        tmp_oceny := tmp_oceny^.nastepna_ocena;
                end;
                writeln;

       tmp_przedmioty  := tmp_przedmioty^.nastepny_przedmiot;
        end;
        end;
   head := head^.nastepny_uczen;
   end;
end;

{ wyswietla menu }
procedure wyswietl_menu;
begin
   Window(1,1,15,25);
   TextBackGround(LightCyan);
   ClrScr;
   Writeln('MENU');

   Writeln;

   Writeln('Uczniowie');
   Write(MENU_LEWY_ZANK); TextColor(LightRed);  Write(' D'); TextColor(LightGray); Writeln('odaj');
   Write(MENU_LEWY_ZANK); TextColor(LightRed);  Write(' W'); TextColor(LightGray); Writeln('ykaz ocen');
   Write(MENU_LEWY_ZANK); TextColor(LightRed);  Write(' L'); TextColor(LightGray); Writeln('ista uwag');
   Write(MENU_LEWY_ZANK); TextColor(LightRed);  Write(' U'); TextColor(LightGray); Writeln('waga+');
   Write(MENU_LEWY_ZANK); TextColor(LightRed);  Write(' O'); TextColor(LightGray); Writeln('dwolaj');
   Write(MENU_LEWY_ZANK); TextColor(LightRed);  Write(' ['); TextColor(LightGray); Writeln('Przedmiot+');
   Write(MENU_LEWY_ZANK); TextColor(LightRed);  Write(' ]'); TextColor(LightGray); Writeln('Przedmiot-');
   Write(MENU_LEWY_ZANK); TextColor(LightRed);  Write(' /'); TextColor(LightGray); Writeln('Ocena+');
   Write(MENU_LEWY_ZANK); TextColor(LightRed);  Write(' \'); TextColor(LightGray); Writeln('OcenY-');

   GoToXY(1,24);

                         TextColor(LightRed);  Write('W'); TextColor(LightGray); Writeln('yjscie');

end;

{ wyswietla glowne okno programu }
procedure wyswietl_glowne_okno;
begin
   Window(17,1,80,26);
   TextBackGround(Black);
   ClrScr;
end;

{ drukuje sperator rozdzielajacy menu od glownego okna }
procedure wyswietl_separator;
var i:integer;
begin
   Window(16,1,17,25);
   ClrScr;
   For i:=1 To 25 Do Writeln(MENU_ROZDZIELACZ_ZANK);
end;

{ wyswietla jak widac }
procedure stworz_okna;
begin
    Window(10,1,80,25);

    wyswietl_menu;
    wyswietl_separator;
    wyswietl_glowne_okno;

end;

{ okono do dodania ucznia }
procedure okno_dodaj_ucznia(var head: wuczen);
var
   imie, nazw : string;
   nowy_uczen : personal;
   tmp_uczen : wuczen;

begin
     ClrScr;

     Write('Imie: ');
     readln(imie);

     Write('Nazwisko: ');
     readln(nazw);

     if not pusty_string(imie) and not pusty_string(nazw) then begin
        nowy_uczen.imie := imie;
        nowy_uczen.nazwisko := nazw;

        tmp_uczen := szukaj_ucznia(head, nowy_uczen);

        { sprawdzamy czy taki uczen aby nie istnieje }
        if tmp_uczen = nil then begin
           dodaj_ucznia(head, nowy_uczen);
           writeln('Dodano ucznia.');
        end
        else begin
           writeln('Taki uczen juz istnieje.');
        end;
      end
      else begin
       writeln('Nie wypelniono wszystich pol.')
     end;
end;


end.

